<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Services\PasswordPolicyService;

class UpdateUserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
     */
    public function rules(): array
    {
        // 获取路由参数（可能是 User 模型实例或 ID）
        $routeUser = $this->route('user');
        $userId = null;
        $originalUsername = null;
        
        // 尝试从路由参数获取用户信息
        if ($routeUser instanceof \App\Models\User) {
            // 路由模型绑定，直接获取 User 实例
            $userId = $routeUser->id;
            $originalUsername = $routeUser->username;
        } elseif ($routeUser) {
            // 路由参数是 ID，需要查询用户
            $userId = $routeUser;
            $userModel = \App\Models\User::find($userId);
            if ($userModel) {
                $originalUsername = $userModel->username;
            }
        } else {
            // 尝试从 'id' 路由参数获取（兼容不同的路由定义）
            $routeId = $this->route('id');
            if ($routeId) {
                $userId = $routeId;
                $userModel = \App\Models\User::find($userId);
                if ($userModel) {
                    $originalUsername = $userModel->username;
                }
            }
        }
        
        $passwordPolicy = app(PasswordPolicyService::class);
        
        // 构建用户名验证规则
        $usernameRules = [
            'required',
            'string',
            'max:255',
            'regex:/^[a-zA-Z0-9_]+$/',
        ];
        
        // 添加唯一性验证（如果用户ID存在）
        if ($userId) {
            $usernameRules[] = 'unique:users,username,' . $userId;
        } else {
            $usernameRules[] = 'unique:users';
        }
        
        // 只有当新用户名和原用户名不同时，才禁止包含'admin'
        // 如果用户名没有修改（保持原值），则允许包含'admin'
        $newUsername = $this->input('username');
        if ($newUsername !== null) {
            $newUsername = trim($newUsername);
            // 如果原用户名为空，或者新用户名和原用户名不同（不区分大小写），则禁止包含'admin'
            if ($originalUsername === null || strcasecmp($newUsername, trim($originalUsername)) !== 0) {
                // 用户名被修改了，或者这是新用户，禁止包含'admin'
                $usernameRules[] = 'not_regex:/admin/i';
            }
            // 如果新用户名和原用户名相同（不区分大小写），则允许包含'admin'，不添加 not_regex 规则
        } else {
            // 如果新用户名为空，仍然添加 not_regex 规则（虽然 required 规则会先触发）
            $usernameRules[] = 'not_regex:/admin/i';
        }
        
        $rules = [
            'username' => $usernameRules,
            'nickname' => 'nullable|string|max:255',
            'email' => 'nullable|email|max:255' . ($userId ? '|unique:users,email,' . $userId : '|unique:users'),
            'phone' => 'nullable|string|max:20|regex:/^1[3-9]\d{9}$/' . ($userId ? '|unique:users,phone,' . $userId : '|unique:users'),
            'status' => 'required|integer|in:' . implode(',', [
                \App\Models\User::STATUS_DISABLED,
                \App\Models\User::STATUS_ENABLED,
            ]),
            'max_devices' => 'nullable|integer|min:1|max:5',
            'dept_id' => 'nullable|exists:departments,id',
            'role_ids' => 'nullable|array',
            'role_ids.*' => 'exists:roles,id',
            'remark' => 'nullable|string|max:500',
        ];
        
        // 如果提供了密码，则验证密码强度
        if ($this->has('password') && !empty($this->password)) {
            $rules['password'] = ['required', 'string', $passwordPolicy->getPasswordRules()];
        }
        
        return $rules;
    }

    /**
     * Get custom messages for validator errors.
     *
     * @return array
     */
    public function messages(): array
    {
        return [
            'username.required' => '用户名不能为空',
            'username.unique' => '用户名已存在',
            'username.regex' => '用户名只能包含字母、数字和下划线',
            'username.not_regex' => '用户名不能包含"admin"字符，admin为系统内置用户',
            'username.max' => '用户名长度不能超过255个字符',
            'email.email' => '邮箱格式不正确',
            'email.unique' => '邮箱已存在',
            'email.max' => '邮箱长度不能超过255个字符',
            'phone.unique' => '手机号已存在',
            'phone.regex' => '手机号格式不正确',
            'phone.max' => '手机号长度不能超过20个字符',
            'password.required' => '密码不能为空',
            'password.min' => '密码长度不能少于8位',
            'status.required' => '状态不能为空',
            'status.in' => '状态值不正确',
            'max_devices.integer' => '最大设备数必须是整数',
            'max_devices.min' => '最大设备数不能少于1',
            'max_devices.max' => '最大设备数不能超过5',
            'dept_id.exists' => '部门不存在',
            'role_ids.*.exists' => '角色不存在',
            'remark.max' => '备注长度不能超过500个字符',
        ];
    }
}

